1. 两数之和
1. 两数之和
分析
一开始的时候,我想到的是两层 for 循环,但是这样不符合题目的要求,因此,我们得想个办法,用这个办法跳过已经算过的组合,这样复杂度就不是
后来我放弃了,还是想用双指针法,然后想到了一个思路,先对数组进行排序,然后用双指针查找元素,slow 索引的初始值是 0,fast 的初始值是 nums.length-1,如果两指针指向的数字之和小于目标值,就向右移动 slow ,大于目标值,就向左移动 fast,如果两个指针相遇,就跳出循环,这样确实是可以找到目标元素(甚至可以找到所有和为 target 的目标元素组合),但是题目要求的是返回元素的下标,而不是元素本身,因此这个做法泡汤了。
后面在 15. 三数之和 我们会重试这种方法
看题解,题解的做法其实就是,在遍历过的元素中寻找另一个值,这样,其实就是把双层 for 循环解法中内部的那个循环,变成了一个 hash 表查询,复杂度为
解题
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> scaned = new HashMap<>();
for(int i=0;i<nums.length;i++){
int numNow = nums[i];
Integer anotherIndex = scaned.get(target-numNow);
if(anotherIndex==null){
scaned.put(numNow,i);
}else{
return new int[]{anotherIndex,i};
}
}
return null;
}